home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Speccy ClassiX 1998
/
Speccy ClassiX 98.iso
/
amiga_system
/
the_aminet
/
dev
/
gcc
/
ixemulsrc.lha
/
ixemul-41.4
/
library
/
__close.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-27
|
2KB
|
79 lines
/*
* This file is part of ixemul.library for the Amiga.
* Copyright (C) 1991, 1992 Markus M. Wild
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: __close.c,v 1.2 1994/06/19 15:18:48 rluebbert Exp $
*
* $Log: __close.c,v $
* Revision 1.2 1994/06/19 15:18:48 rluebbert
* *** empty log message ***
*
*/
#define KERNEL
#include "ixemul.h"
#include "kprintf.h"
int
__close(struct file *f)
{
int omask;
ix_lock_base ();
f->f_count--;
KPRINTF (("__close: closing file $%lx, f_count now %ld.\n", f, f->f_count));
if (f->f_count > 0) goto unlock;
/* don't need file locking here... if the counter is down to 0, nobody
else CAN have this file locked */
__wait_packet(&f->f_sp);
if (!(f->f_flags & FEXTOPEN))
__Close (CTOBPTR (f->f_fh));
/* if we have to set some modes, do it now */
if (f->f_stb_dirty)
{
syscall (SYS_chmod, f->f_name, f->f_stb.st_mode);
/* should later also set modification time */
}
if (f->f_flags & FUNLINK) syscall (SYS_unlink, f->f_name);
/* NOTE: the FEXTOPEN flag tells us two things: 1) we shouldn't
* perform a Close() on the filehandle, and 2) the name in the
* file structure wasn't allocated by malloc(), so we shouldn't
* free() it either. */
if (!(f->f_flags & FEXTOPEN) && f->f_name)
{
KPRINTF (("f->f_name(%s) ", f->f_name));
kfree (f->f_name);
}
if (f->f_async_len)
{
KPRINTF (("f->f_async_len "));
kfree (f->f_async_buf);
}
unlock:
ix_unlock_base ();
return 0;
}